.. _cmmMsRegisterSlave: cmmMsRegisterSlave ==================== -------------------- SYNOPSIS ````````````` .. code-block:: none VT_I4 cmmMsRegisterSlave( [in] VT_I4 Axis, [in] VT_R8 MaxSpeed, [in] VT_I4 IsInverse ) DESCRIPTION ````````````` - 지정한 축을 Slave 축으로 등록/해제 합니다. 이때 마스터축은 자동으로 결정되며, 축 번호상 앞의 축이 자동적으로 Master 축으로 됩니다. 단, 해당 축의 Master/Slave 모드를 설정하는 하드웨어 스위치가 연결되지 않은 경우에는 Slave 축이 등록되어도 Master/Slave 동작이 정상적으로 동작하지 않습니다. PARAMETER ``````````` - Axis: Slave 축으로 지정/해제할 축번호. 축 번호는 0 부터 시작합니다. \ - MaxSpeed : Slave 축이 구동될 수 있는 최대속도. Master 축이 이 값보다 큰 속도로 구동되면 오동작할 수 있습니다. 속도의 단위는 “Unit speed”에 의해 정의되는 논리적 속도입니다. \ - IsInverse : Slave 축의 구동방향과 Master 축의 구동방향을 반대로 할 것인지를 결정합니다. .. csv-table:: :widths: 10 85 :header-rows: 1 :stub-columns: 0 Value, Meaning 0 또는 cmFALSE, Master 축과 Slave 축의 구동방향을 동일하게 함. 1 또는 cmTRUE, Master 축과 Slave 축의 구동방향을 반대로 함. RETURN VALUE ````````````` +--------------+-----------+ | Value | Meaning | +==============+===========+ | 음수 | 수행 실패 | +--------------+-----------+ | cmERR_NONE | 수행 성공 | +--------------+-----------+ REFERENCE ``````````````` - 이 함수가 수행되면 지정한 축은 Manual Pulsar 모드로 전환되게 됩니다. Maser/Slave 에 관련된 하드웨어 스위치 설정이 적절하게 되었으면 지정한 축의 PA/PB 입력핀에 Master 축의 Command 펄스 신호가 자동으로 입력되고, 따라서 두 축이 동기제어됩니다. \ - Master 축의 Command 출력모드는 반드시 “CW & CCW 모드 (출력모드 4 ~ 5 번)”로 설정되어 있어야 합니다. Master 축의 Command 출력모드가 “Pulse & Direction 모드 (출력모드 0 ~ 3 번)”로 설정된 경우에는 Slave 축이 한쪽방향으로만 구동되게 됩니다. Command 출력모드의 설정에 관해서는 cmmCfgSetOutMode() 함수 설명편을 참조하시기 바랍니다. \ - Master 축의 Command 출력 모드가 “Pulse & Direction 모드” 로 설정된 경우 (출력모드 0~3) 에는 Master / Slave 기능을 양방향에서 원할하게 사용할 수 없습니다. \ - 이 함수가 성공적으로 수행되었으면 cmmStReadMotionState() 함수의 반환값이 8(cmMST_WAIT_PLSR)이 됩니다. 이를 확인하면 지정한 축이 Slave 모드로 전환되었는지를 확인할 수 있습니다. 그러나 하드웨어 스위치 설정은 소프트웨어적으로 확인되지 않습니다. \ - Slave 축은 CLR(Counter Clear) 입력과 INP 입력이 자동으로 Disable 됩니다. 따라서 이 함수를 호출한 이후에 CLR 입력과 INP 입력을 Enable 시키는 환경설정을 수행해서는 안됩니다. \ - Slave 모드가 해제되면 해당 축의 CLR 입력모드와 INP 입력모드는 cmmMsRegisterSlave() 함수가 호출되기 이전의 설정으로 복원됩니다. EXAMPLE ````````` 본 예제는 1 번(Y1) 축을 Slave 축으로 설정하여 Master/Slave 동기제어를 수행하는 예제입니다. 1 번축의 마스터축은 자동으로 0 번축으로 설정됩니다. 본 예제에서는 원점복귀 하는 함수를 두 가지 방식으로 예시합니다. 사용자는 두 가지 방식중에 하나를 선택적으로 사용하시면 됩니다. ★. 하드웨어적인 SYNC 스위치 중에서 “0->1“ 로 표기된 두 개의 스위치를 연결하여 합니다. ★. 마스터축인 0 번 축의 Command 출력모드는 반드시 “CW & CCW 모드 (출력모드 4 ~ 5 번)”로 설정되어 있어야 합니다. .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #include "Cmmsdk.h" #include "CmmsdkDef.h" #define N_AXES 2 // 2 축 /*************************************************************** * OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이 * 적용되는 부분을 의미합니다. ***************************************************************/ void OnProgramInitial() { long m_nNumAxes; cmmLoadDll(); if(cmmGnDeviceLoad(cmTRUE, &m_nNumAxes) != cmERR_NONE) { //Handle 은 사용자가 생성한 폼의 핸들 값입니다. cmmErrShowLast(Handle); return; } // 1 번(Y1) 축을 Slave 축으로 등록합니다. => 마스터는 0 번(X1) 축 // if(cmmMsRegisterSlave (cmY1, 500000, cmFALSE) != cmERR_NONE){ cmmErrShowLast(Handle); } } /*************************************************************** * OnHomeReturn1() : 이 함수에서는 원점복귀시에는 1 번축의 Slave 모드를 해제한 상태에서 0 번과 1 번축이 동시에 원점복귀를 수행한 후, 원점복귀가 완료되면 다시 1 번축의 Slave 모드를 복원하는 방식을 취하였습니다. * OnHomeReturn1() 대신에 OnHomeReturn2() 방식을 사용할 수도 있습니다. ****************************************************************/ void OnHomeReturn1() { ///////////////////////////////////////////////////////////// // 원점복귀를 하기 위해 1 번축을 Slave 모드에서 해제한다. if(cmmMsUnregisterSlave (cmY1) != cmERR_NONE){ cmmErrShowLast(Handle); return; } //X1 축과 Y1 축의 홈복귀 속도 패턴을 설정 합니다. 참고적으로 역방향 속도는 100 으로 설정하였습니다. cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000, 100); cmmHomeSetSpeedPattern(cmY1, cmSMODE_S, 10000, 30000, 30000, 100); // X1&Y1 축 원점복귀 동시 수행// long nAxes[2]={cmX1, cmY1}; long nDirList[2]={cmDIR_N, cmDIR_N}; if(cmmHomeMoveAll(2, nAxes, nDirList, cmFALSE) != cmERR_NONE){ cmmErrShowLast(Handle); return; } // 1 번(Y1) 축을 Slave 축으로 다시 등록합니다. // if(cmmMsRegisterSlave (cmY1, 500000, cmFALSE) != cmERR_NONE){ cmmErrShowLast(Handle); } } /*************************************************************** * OnHomeReturn2() : 이 함수는 Master/Slave 시스템에서의 원점복귀를 수행하는 함수입니다. 이 함수에서는 원점복귀시에도 Master/Slave 모드를 유지한채 0 번축만 원점복귀를 수행합니다. 1 번축은 Slave 이므로 0 번축의 모션을 똑같이 추종합니다. OnHomeReturn2() 대신에 OnHomeReturn1() 방식을 사용할 수도 있습니다. ***************************************************************/ void OnHomeReturn2() { // X1 축 홈복귀 속도패턴 설정 // cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000); // X1 축 원점복귀 시작 // if(cmmHomeMoveStart(cmX1, cmDIR_N) != cmERR_NONE){ cmmErrShowLast(Handle); return; } if(cmmHomeWaitDone(cmX1, cmFALSE) != cmERR_NONE){ cmmErrShowLast(Handle); return; } } /************************************************************** * OnDoMotion() : 모션을 수행하는 가상의 함수. 이 함수에서는 0 번축만 제어 * 하지만 실제제어되는 것은 0 번축과 1 번축이 함께 제어됩니다. **************************************************************/ void OnDoMotion() { cmmCfgSetSpeedPattern(cmX1, cmSMODE_S, 10000, 100000, 100000); cmmSxMove(cmX1, 1000, cmFALSE); // Move 1000 cmmSxMove(cmX1, 1000, cmFALSE); // Move 1000 cmmSxMove(cmX1, -1000, cmFALSE); // Move -1000 cmmSxMove(cmX1, -1000, cmFALSE); // Move -1000 } /************************************************************** * OnStop() : “Stop”명령시에 호출되는 가상의 함수 **************************************************************/ void OnStop() { cmmMxStopEmg(N_AXES, nAxisList); } .. code-block:: none :linenos: Visual Basic '/************************************************************** '* OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이 '* 적용되는 부분을 의미합니다. '*************************************************************** Private Sub OnProgramInitial() If cmmGnDeviceLoad(cmTRUE, m_nNumAxes) <> cmERR_NONE Then 'Handle 은 사용자가 생성한 폼의 핸들 값입니다. Call cmmErrShowLast(thisform.Hwnd) End End If '1 번(Y1) 축을 Slave 축으로 등록합니다. => 마스터는 0 번(X1) 축 If cmmMsRegisterSlave(cmY1, 500000, cmFALSE) <> cmERR_NONE Then Call cmmErrShowLast(thisform.Hwnd) End If End Sub '/************************************************************* '* OnHomeReturn1() : 이 함수에서는 원점복귀시에는 ‘* 1 번축의 Slave 모드를 해제한 상태에서 0 번과 1 번축이 동시에 원점복귀를 ‘* 수행한 후, 원점복귀가 완료되면 다시 1 번축의 Slave 모드를 복원하는 ‘* 방식을 취하였습니다. '* OnHomeReturn1() 대신에 OnHomeReturn2() 방식을 사용할 수도 있습니다. '*************************************************************** Private Sub OnHomeReturn1() ' // 원점복귀를 하기 위해 1 번축을 Slave 모드에서 해제한다. If cmmMsUnregisterSlave(cmY1) <> cmERR_NONE Then Call cmmErrShowLast(thisform.Hwnd) End End If '//X1 축과 Y1 축의 홈복귀 속도 패턴을 설정 합니다. Call cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000, 100) Call cmmHomeSetSpeedPattern(cmY1, cmSMODE_S, 10000, 30000, 30000, 100) '// X1&Y1 축 원점복귀 동시 수행// Dim nAxes(2) As Long Dim ndirList(2) As Long nAxes(0) = cmX1 nAxes(1) = cmY1 ndirList(0) = cmDIR_N ndirList(1) = cmDIR_N If cmmHomeMoveAll(2, nAxes(0), ndirList(0), cmFALSE) <> cmERR_NONE Then Call cmmErrShowLast(thisform.Hwnd) End End If '// 1 번(Y1) 축을 Slave 축으로 다시 등록합니다. // If cmmMsRegisterSlave(cmY1, 500000, cmFALSE) <> cmERR_NONE Then Call cmmErrShowLast(thisform.Hwnd) End If End Sub '/************************************************************** '* OnHomeReturn2(): 이 함수는 Master/Slave 시스템에서의 원점복귀를 수행 '* 하는 함수입니다. 이 함수에서는 원점복귀시에도 Master/Slave 모드를 유지한 '* 채 0 번축만 원점복귀를 수행합니다.1 번축은 Slave 이므로 0 번축의 모션을 똑 '* 같이 추종합니다. OnHomeReturn2()대신에 OnHomeReturn1() 방식을 사용할 '* 수도 있습니다. '**************************************************************/ Private Sub OnHomeReturn2() '// X1 축 홈복귀 속도패턴 설정 // Call cmmHomeSetSpeedPattern(cmX1, cmSMODE_S, 10000, 30000, 30000) '// X1 축 원점복귀 시작 // If cmmHomeMoveStart(cmX1, cmDIR_N) <> cmERR_NONE Then cmmErrShowLast (thisform.Hwnd) End End If If cmmHomeWaitDone(cmX1, cmFALSE) <> cmERR_NONE Then cmmErrShowLast (thisform.Hwnd) End End If End Sub '/************************************************************** '* OnDoMotion() : 모션을 수행하는 가상의 함수. 이 함수에서는 0 번축만 제어 '* 하지만 실제제어되는 것은 0 번축과 1 번축이 함께 제어됩니다. '**************************************************************/ Private Sub OnDoMotion() Call cmmCfgSetSpeedPattern(cmX1, cmSMODE_S, 10000, 100000, 100000) Call cmmSxMove(cmX1, 1000, cmFALSE) '// Move 1000 Call cmmSxMove(cmX1, 1000, cmFALSE) '// Move 1000 Call cmmSxMove(cmX1, -1000, cmFALSE) '// Move -1000 Call cmmSxMove(cmX1, -1000, cmFALSE) '// Move -1000 End Sub '/************************************************************** '* OnStop() : "Stop"명령시에 호출되는 가상의 함수 '**************************************************************/ Private Sub OnStop() Call cmmMxStopEmg(2, nAxisList(0)) End Sub .. code-block:: none :linenos: Delphi // **************************************************************************** // Master/Slave 동기 구동을 하기 위해 슬레이브 축을 등록 합니다. // **************************************************************************** procedure OnSetMsRegisterSalve (); var nSlaveState : LongInt; // 슬레이브 축 등록 상태 정보. nMasterAxis : LongInt; // 마스터 축 정보. begin // 1 번 축을 슬레이브 축으로 등록합니다. 자동으로 마스터 축은 0(cmX1)번 축이 됩니다. if cmmMsRegisterSlave (cmY1, 655350, cmFALSE ) = ceERR_NONE then begin // 슬레이브 축의 등록 상태를 확인 합니다. cmmMsCheckSlaveState (cmY1, @nSlaveState ); if nSlaveState <> cmTRUE then begin ShowMessage ( ‘Slave axis registered failed’ ); end; // 슬레이브 축의 마스터 축을 확인합니다. cmmMsGetMasterAxis (cmY1, @nMasterAxis ); if nMasterAxis <> cmX1 then begin ShowMessage ( ‘Slave axis registered failed’ ); end; end; end; // **************************************************************************** // 마스터 축에 대해 단축 이송 작업을 수행합니다. 슬레이브 축이 등록 // 되어 있으므로 마스터 축 제어 시 슬레이브 축이 함께 제어됩니다. // **************************************************************************** procedure OnMove (); begin // 마스터 축 속도 환경을 설정합니다. cmmCfgSetSpeedPattern (cmX1, cmSMODE_S, 5000, 30000, 30000 ); // 마스터 축 단축 이송 수행 시 슬레이브 축이 함께 이송합니다. cmmSxMove (cmX1, 15000, cmFALSE ); end; .. seealso:: :ref:`cmmMsUnregisterSlave`